package swardToOffer.struct_1_arr;

import java.util.Arrays;

/**
 * @Author ChanZany
 * @Date 2021/5/21 14:17
 * @Version 1.0
 面试题21：调整数组顺序使奇数位于偶数前面
 题目：输入一个整数数组，实现一个函数来调整该数组中数字的顺序，使得所有
 奇数位于数组的前半部分，所有偶数位于数组的后半部分。
 用快排的思路，用两个指针标记数组的首尾，交换指针所指向的数据使得左奇右偶
 */
@FunctionalInterface
interface Func { //定义一个函数接口
    public boolean func(int value);
}
public class ReorderArray {
    void reorderOddEvent(int[] data){
        if (data.length==0) return;
        int left = 0;
        int right = data.length-1;
        while (left<right){
            while (left<right && data[left]%2!=0) left++; //找到偶数
            while (left<right && data[right] %2 !=1) right--;//找到奇数
            //奇数和偶数交换
            if (left<right){
                int tmp = data[right];
                data[right]=data[left];
                data[left] = tmp;
            }
        }
    }

    //通过函数式接口修改reorder条件，增加代码可重用性
    void reorderOddEventImprove(int[] data,Func func){
        if (data.length==0) return;
        int left = 0;
        int right = data.length-1;
        while (left<right){
            while (left<right && !func.func(data[left])) left++; //找到偶数
            while (left<right && func.func(data[right])) right--;//找到奇数
            //奇数和偶数交换
            if (left<right){
                int tmp = data[right];
                data[right]=data[left];
                data[left] = tmp;
            }
        }
    }

    public static void main(String[] args) {
        ReorderArray Main = new ReorderArray();
        int[] data = {2, 4, 6, 1, 3, 5};
//        Main.reorderOddEvent(data);
        Main.reorderOddEventImprove(data,t-> t%3==0);
        System.out.println(Arrays.toString(data));
    }
}
